package main

import "fmt"

/**
package fmt
func Fprintf(w io.Writer, format string, args ...interface{}) (int, error)
func Printf(format string, args ...interface{}) (int, error) {
	return Fprintf(os.Stdout, format, args...)
}
func Sprintf(format string, args ...interface{}) string {
	var buf bytes.Buffer
	Fprintf(&buf, format, args...)
	return buf.String()
}

ps:
	Fprintf函数第一个参数为io.Writer接口类型
	os.Stdou bytes.Buffer均实现了io.Writer接口，因此可以正常传入使用

 */

type ByteCounter int

func (c *ByteCounter) Write(p []byte) (int, error) {
	*c += ByteCounter(len(p))
	return len(p), nil
}


func main() {
	var c ByteCounter
	_, _ = c.Write([]byte("hello"))
	fmt.Println(c)  // "5", = len("hello")

	c = 0  // reset the counter

	var name = "Dolly"
	_, _ = fmt.Fprintf(&c, "hello, %s", name)  // 第一个参数为io.Writer接口,我们传的实际类型为 *ByteCounter
	fmt.Println(c)  // 12, = len("hello, Dolly")

}


/**
如何理解接口是合约？

a: 接口是一个抽象数据类型，其定义了所属的方法；
	凡是实现了这些方法的具体类型，即满足了这个接口类型
	外部使用接口时，不论具体的类型是什么，而只能使用接口定义的方法

 */


